// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the OCCAPPLICATION_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// OCCAPPLICATION_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#pragma once
#ifdef OCCAPPLICATION_EXPORTS
#define OCCAPPLICATION_API __declspec(dllexport)
#else
#define OCCAPPLICATION_API __declspec(dllimport)
#endif
#include <vtkSmartPointer.h>

class TopoDS_Shape;
class TopoDS_Wire;
class Geom_BSplineCurve;

class vtkActor;

namespace OCCApp
{

	enum class LoftType
	{
		BSpline,
		ClosedLoft,
		ComplexBSpline
	};

	OCCAPPLICATION_API TopoDS_Wire MakeRectangleWire(double width, double height, double z0);
	OCCAPPLICATION_API TopoDS_Wire MakeCircleWire(double radius, double z0);
	OCCAPPLICATION_API TopoDS_Wire MakeEllipseWire(double majorRadius, double minorRadius, double z0);


	class OCCAPPLICATION_API LoftFactory
	{
	public:
		vtkSmartPointer<vtkActor> get_loft_vector();
	protected:
		virtual TopoDS_Shape make_loft_shape() = 0;
	private:
		vtkSmartPointer<vtkActor> get_vtk_data(TopoDS_Shape OccShape);
	};

	class OCCAPPLICATION_API BSplineLoftFactory : public LoftFactory
	{
	protected:
		TopoDS_Shape make_loft_shape() override;
	};

	class OCCAPPLICATION_API ClosedLoftFactory : public LoftFactory
	{
	protected:
		TopoDS_Shape make_loft_shape() override;
	};

	class OCCAPPLICATION_API ComplexBSplineLoftFactory : public LoftFactory
	{
	protected:
		TopoDS_Shape make_loft_shape() override;
	};
}
